<?php

namespace Sharks\Core\Http\Form;

use ReflectionClass;
use Sharks\Core\Support\Base\Precondition;

/**
 * 表单域
 */
class FormField {

    private $field;
    private $hasError;
    private $errors;
    private $hasValue;
    private $value;

    public function __construct($field, array $container = array()) {
        $this->field = $field;
        $this->hasError = false;
        $this->errors = array();
        $this->hasValue = isset($container[$field]);
        $this->value = $this->hasValue ? $container[$field] : null;
    }

    public function hasError() {
        return $this->hasError;
    }

    public function getErrors() {
        return $this->errors;
    }

    public function __call($name, $args) {
        if ('notNull' != $name && false == $this->hasValue) {//如果无值 且不是notNull判断，则不用判断
            return $this;
        }
        $ruleName = '\\Sharks\\Core\\Support\\Constaints\\' . ucfirst($name) . 'Rule';
        Precondition::check(class_exists($ruleName), '验证规则 $name 不存在');

        $ruleInstance = new ReflectionClass($ruleName);
        array_unshift($args, $this->value);
        $rule = $ruleInstance->newInstanceArgs($args);
        if (!$rule->validate()) {
            $this->addError(ucfirst($name), $rule->getMessage());
        }
        return $this;
    }

//    /**
//     * @deprecated
//     * @see required
//     */
//    public function notNull($msg = null) {
//        if (false == $this->hasValue || empty($this->value)) {
//            $this->addError('NotNull', $msg);
//        }
//
//        return $this;
//    }
//
//    /**
//     * 接入外部检验，检查传入是否为true
//     * @param  Boolean  $bool 是否为true
//     * @param  String   $msg  消息
//     */
//    public function check($bool, $msg = null) {
//        if (false == $bool) {
//            $this->addError('Check', $msg);
//        }
//        return $this;
//    }
//
//    public function checkNot($bool, $msg = null) {
//        return $this->check(!$bool, $msg);
//    }
//
//    public function required($msg = null) {
//        if (false == $this->hasValue || empty($this->value)) {
//            $this->addError('Required', $msg);
//        }
//
//        return $this;
//    }
//
//    public function lengthBetween($maxLength, $minLength = 1, $msg = null) {
//        if (false == $this->hasValue) {
//            return $this;
//        }
//
//        $valueCount = strlen($_REQUEST[$this->field]);
//        if ($maxLength < $valueCount || $minLength > $valueCount) {
//            $this->addError('Length', $msg);
//        }
//
//        return $this;
//    }
//
//    public function length($length, $msg = null) {
//        if (false == $this->hasValue) {
//            return $this;
//        }
//
//        $valueCount = strlen($_REQUEST[$this->field]);
//
//        if ($length != $valueCount) {
//            $this->addError('Length', $msg);
//        }
//
//        return $this;
//    }
//
//    public function isChineseCellphone($msg = null) {
//        if (false == $this->hasValue) {
//            return $this;
//        }
//
//        if (!preg_match("/^\d{11}$/", $this->value)) {
//            $this->addError('ChineseCellphone', $msg);
//        }
//
//        return $this;
//    }
//
//    public function isNum($msg) {
//        if (false == $this->hasValue) {
//            return $this;
//        }
//
//        if (!is_numeric($this->value)) {
//            $this->addError('IsNumeric', $msg);
//        }
//        return $this;
//    }
//
//    public function regMatch($regStr, $msg = null) {
//        if (false == $this->hasValue) {
//            return $this;
//        }
//
//        if (!preg_match($regStr, $this->value)) {
//            $this->addError('RegMatch', $msg);
//        }
//
//        return $this;
//    }
//
//    public function equal($equalValue, $msg = null) {
//        if (false == $this->hasValue) {
//            return $this;
//        }
//
//        if ($this->value != $equalValue) {
//            $this->addError('Equal', $msg);
//        }
//        return $this;
//    }
//
//    public function equalSession($sessionName, $msg = null) {
//        if (false == $this->hasValue) {
//            return $this;
//        }
//
//        if (!isset($_SESSION[$sessionName]) || $this->value != $_SESSION[$sessionName]) {
//            $this->addError('EqualSession', $msg);
//        }
//        return $this;
//    }
//
//    public function equalField($fieldName, $msg = null) {
//        if (false == $this->hasValue) {
//            return $this;
//        }
//        $otherValue = $_REQUEST[$fieldName];
//
//        if ($this->value != $otherValue) {
//            $this->addError('EqualField', $msg);
//        }
//
//        return $this;
//    }
//
//    public function passwordVerify($hash, $msg = null) {
//        if (false == $this->hasValue) {
//            return $this;
//        }
//        if (!password_verify($this->value, $hash)) {
//            $this->addError('PasswordVerify', $msg);
//        }
//        return $this;
//
//    }

    protected function addError($type, $msg) {
        if (empty($msg)) {
            $msg = "$this->field is invalid";
        }
        $this->hasError = true;
        $this->errors[] = array('msg' => $msg, 'type' => $type, 'field' => $this->field);
    }
}